//
// Created by Lenovo on 2021/12/21.
//

#include "LinkList_Stack.h"



Status InitStack(LinkStack *S){

    S->base=NULL;   //初始化栈
    S->top=S->base;
    S->StackSize=0;
    return OK;
}  //构造一个空栈


Status DestroyStack(LinkStack *S){
    if(S==NULL) return ERROR;
    SNode *Ptmp=S->top->below;  //保存下一个栈结点的地址
    while (S->top!=NULL){
        free(S->top);   //释放当前结点空间
        S->top=Ptmp;    //栈顶指针指向下一个结点位置
        Ptmp=S->top->below;//更新保存结点位置
    }
    free(S);   //释放栈空间
    S=NULL;
    return OK;
}    //销毁栈S，S不再存在


Status ClearStack(LinkStack *S){
    if(S==NULL||S->base==NULL) return ERROR;
    SNode *Ptmp=S->top->below;  //原理同销毁栈函数
    while (S->top!=NULL){
        free(S->top);
        S->top=Ptmp;
        if(S->top!=NULL)
            Ptmp=S->top->below;
    }
    S->base=S->top;
    S->StackSize=0;
    return OK;
}  //把S置为空栈


Status StackEmpty(LinkStack S){
    if(S.base==NULL)    return ERROR;
    if(S.base==S.top)   return TRUE;
    else    return FALSE;
}   //若S为空栈返回TRUE，否则返回FALSE


int StackLength(LinkStack S){
    //用栈内元素个数来表示栈的长度
    if(S.base==NULL)    return ERROR;
    return (int)(S.StackSize)/(int)(sizeof(SNode));
}     //返回S的元素个数，即栈的长度


SElemType* GetTop(LinkStack S){
    SElemType *re;  //用于保存栈顶元素的值
    if(S.top==S.base)   return NULL;
    re=(S.top->data);
    return re;
}  //若栈不空，则返回栈顶元素，否则返回NULL


Status Push(LinkStack *S,SElemType e){
    SNode *newE=(SNode *) malloc(sizeof(SNode));    //为新结点创建空间
    if(!newE)   return ERROR;   //如果空间已满，分配失败
    //初始化新结点
    newE->below=NULL;
    newE->data=(SElemType*) malloc(sizeof(SElemType));
    *newE->data=e;
    //如果栈为空
    if(S->top==NULL){
        S->base=newE;
        S->top=newE;
    } else{
        //栈不为空
        newE->below=S->top;
        S->top=newE;
    }
    //更新栈数据
    S->StackSize+=(sizeof(SNode));
    return OK;
}    //插入元素e为新的栈顶元素


SElemType* Pop(LinkStack *S){
    SElemType *re;  //用于返回从栈删除的值
    if(S->top==S->base) return NULL;    //判断栈是否为空
    SNode *Ptmp=S->top->below;
    re=S->top->data;    //给返回元素赋值
    free(S->top);   //释放栈顶元素空间
    S->top=Ptmp;
    S->StackSize- sizeof(SNode);    //更新栈的属性
    return re;
}  //若栈不空，则删除栈顶元素并返回，否则返回NULL

void StackForTraverse(SNode *p,Status(*visit)(SElemType)){
    if(p!=NULL){
        StackForTraverse(p->below,visit);
        visit(*p->data);
    }
}

Status StackTraverse(LinkStack S,Status (*visit)(SElemType)){
    if(S.base==NULL)    return ERROR;
    StackForTraverse(S.top,visit);
    return OK;
}     //从栈底到栈顶一次对栈中每个元素调用函数visit（），一旦visit（）失败，则返回ERROR